"""author: wenyao
   data: 2021/11/19
   project: cjh
"""
#计算机是只能识别二进制
#二进制是机器的语言
#文字是人类的语言

#人类想要操控计算机，这其中就会有一个转换的过程

#编码 -- 单词表
#人类语言与机器语言的映射关系

#ascii码   对英文字符进行编码
#unicode编码 万国码  基本上所有的文字都给一个编码

#python2中默认编码ascii码
#python3中默认编码是utf-8

#utf-8 utf-16 utf-32  gbk 都是unicode的具体实现方式
#utf-8  一个英文字符是占用一个字节
#       一个中文字符占用三个字节

#gbk
#一个字符占用2个字节

#如果中文比较多，使用gbk

# 查看编码
# >>> ord("A")
# 65
# >>> ord("a")
# 97
# >>> ord("三")
# 19977
# >>> ord("创")
# 21019
# >>> bin(19977)
# '0b100111000001001'

##########
#str -- > bytes  str1.encode("utf-8")
#bytes --> str   str1.decode("utf-8")

#以什么方式加码，就要以什么方式解码
# >>> str1 = "中文"
# >>> str1.encode("utf-8")
# b'\xe4\xb8\xad\xe6\x96\x87'
# >>> str1.encode("gbk")
# b'\xd6\xd0\xce\xc4'
# >>> b'\xe4\xb8\xad\xe6\x96\x87'.decode("utf-8")
# '中文'
# >>> b'\xe4\xb8\xad\xe6\x96\x87'.decode("gbk")
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 2: illegal multibyte sequence

#如果文件加码和解码的方式不一致，就会出现乱码的情况

##########文件操作
#open
# open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closef
# d=True, opener=None)
#file：  指定要打开的文件名
#mode：  指定打开的方式
#buffering： 缓存方式
#encoding： 文件的编码方式

#####encoding
#制作两个文件，一个utf-8编码，一个gbk编码

# vim utf-8.txt
#
#查看文件编码
# file utf-8.txt
#
# locale
#
# vim gbk.txt
#
# file gbk.txt
#
#对文件编码进行转换
# iconv -f utf-8 -t gbk gbk.txt > gbk2.txt

#encoding=None  默认情况下，encoding为None，表示系统是什么编码这里就使用什么编码
#使用open去打开文件
# >>> fp = open("utf-8.txt")
# >>> fp.read()
# '这是utf-8\n'
# >>> fp = open("gbk2.txt")
# >>> fp.read()
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
#   File "/usr/lib64/python3.6/codecs.py", line 321, in decode
#     (result, consumed) = self._buffer_decode(data, self.errors, final)
# UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd5 in position 0: invalid continuation byte
# >>> fp = open("gbk2.txt",encoding="gbk")
# >>> fp.read()
# '这是gbk\n'

#python文件编码检测
#安装模块
#[root@kafka01 ~]# pip3 install chardet

# >>> import chardet
# >>> fp = open("utf-8.txt","rb")   #以二进制读的方式打开
# >>> chardet.detect(fp.read())
# {'encoding': 'utf-8', 'confidence': 0.7525, 'language': ''}
# >>> fp = open("gbk2.txt","rb")
# >>> chardet.detect(fp.read())
# {'encoding': 'ISO-8859-5', 'confidence': 0.4388398420352105, 'language': 'Russian'}
# >>>

#文件的打开方式
#文件打开方式： 读  读写  追加写  覆盖写
#文件类型的打开方式： 二进制类型  文本类型

#默认打开方式是只读

#rwxa任选其一, tb任选其一，+是可选项

# r 只读（默认）
# w 覆盖写，会覆盖原来的内容
# x 新建写，如果已经存在文件会报错
# a 追加写
# b 二进制模式打开
# t 文本模式（默认）
# + 读写

# >>> fp = open("test.txt")
# >>> fp.read()
# 'abc\n123\nefg\n'
# >>> fp.write("a")
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# io.UnsupportedOperation: not writable

#写入
# >>> fp = open("test.txt","w")
# >>> fp.write("this is test")
# 12
# >>> fp.close()
# >>> fp.write("this is test2")
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# ValueError: I/O operation on closed file.
# >>> fp = open("test.txt","w")
# >>> fp.write("this is sc!!!!")
# 14
# >>> fp.flush()

#with 语句去管理文件打开
#open函数返回的对象是文件打开对象
#这个对象是一个上下文管理器对象
#只要是一个上下文管理器对象都可以使用with语句去管理

# fp = open("test.txt","w")
# fp.write("this is test")
# fp.close()

#自动实现fp文件连接的关闭
#实现这部分资源的回收
# with open("test.txt","a") as fp:
#     fp.write("append str!\n")
#
# # fp.write("append str!!!!")
# print("ending....")

#buffering：缓存设置
#文件的读写 -- 读缓存 -- 写缓存
#写缓存为例
#默认情况下什么时候会将缓存写入磁盘
#1、fp.close() 文件连接关闭的时候
#2、fp.flush() 执行flush强制将缓存刷新到磁盘
#3、缓冲区满的时候将文件内容刷新到磁盘
#4、程序退出的时候

#python中写缓冲的方式是可以通过buffering参数去设置的
#buffering参数是设置成0~n的整数的
#0 ：  实时写入，不缓存，只适用于二进制模式
#1 ：  行缓存，遇到换行符就写入磁盘，只适用于文本模式
#2~n ：  例如n为2  表示设置缓冲区的大小 2*4096个字节

#文件读取
#fp.read()  从光标位置到文末  也可以指定字符数读取
#fp.readline()  返回光标位置到行末
#fp.readlines()  返回当前光标到文末的内容，每行为一个元素，返回一个列表

#fp.seek() 重置光标
#fp.tell()  告诉光标的位置

#with open("test.txt","rb") as f:
    # for i in range(5):
    #     print(f.readline().decode("utf-8"))

    # f.seek(0)

    # print(f.read().decode("utf-8"))
    #
    # f.seek(-13,2)
    # print(f.read().decode("utf-8"))

    # for i in f:
    #     s = i.decode("utf-8")
    #     if s[0] != "#":
    #         print(s)

#对于大文件的读写
#不要使用默认的read  readlines
#这两个方式会一次性的将文件内容全部读入内存，可能会造成oom

#一行一行读，一行一行进行计算使用
#这一行读完了，就可以在内存里删掉
# for i in  fp:
#     pass

#一行一行读，虽然内存空间问题得到了解决
#但是效率问题上去了
#可以不可以一次读取多一点的数据
#  fp.read(6000)
#  fp.readlines(600)

#1、从网络上下载一张图片到本地
#     requests库
#2、 ip存储与读取文件统计ip频率 (京东二面题)
# • 生成一个大文件ips.txt,要求120000行，每行随即为172.25.254.0/24段的ip;
# • 读取ips.txt文件统计这个文件中ip出现频率前10的ip；
#  每一行的内容是172.25.254.{1-255}随机出现
#3、词频统计
    #词频统计 •
    # 已经有一个瓦尔登湖的文本，“Walden.txt”
    # • 统计这篇文章的词频（每个词出现的次数）
    # • 不统计标点符号
    # • The和the被统计成同一个词（不区分大小写）
    # • 输出格式：{'the': 10,
    #  输出前十
 #                                                                                                      'is': 45....}








